<?php
namespace app\admin\controller;

use Request;
use Session;
use \tp5er\Backup;

class Database extends Base
{
    /**
     * 数据备份列表
     * @return array 列表数组
     */
    public function index()
    {
        $db = new Backup();
        return $this->fetch('index', ['list' => $db->dataList()]);
    }
    /**
     * 备份文件列表
     * @return [type] [description]
     */
    public function importlist()
    {
        $db = new Backup();
        return $this->fetch('importlist', ['list' => $db->fileList()]);
    }

    /**
     * 数据库还原
     * @param  integer $time  [description]
     * @param  [type]  $part  [description]
     * @param  [type]  $start [description]
     * @return [type]         [description]
     */
    public function import($time = 0, $part = null, $start = null)
    {
        $db = new Backup();
        if (is_numeric($time) && is_null($part) && is_null($start)) {
            $list = $db->getFile('timeverif', $time);
            if (is_array($list)) {
                Session::set('backup_list', $list);
                $this->success('初始化完成！', '', array('part' => 1, 'start' => 0));
            } else {
                $this->error('备份文件可能已经损坏，请检查！');
            }
        } else if (is_numeric($part) && is_numeric($start)) {

            $list = Session::get('backup_list');

            $start = $db->setFile($list)->import($start);

            if (false === $start) {
                $this->error('还原数据出错！');
            } elseif (0 === $start) {
                if (isset($list[++$part])) {
                    $data = array('part' => $part, 'start' => 0);
                    $this->success("正在还原...#{$part}", '', $data);
                } else {
                    Session::delete('backup_list');
                    $this->success('还原完成！');
                }
            } else {
                $data = array('part' => $part, 'start' => $start[0]);
                if ($start[1]) {
                    $rate = floor(100 * ($start[0] / $start[1]));
                    $this->success("正在还原...#{$part} ({$rate}%)", '', $data);
                } else {
                    $data['gz'] = 1;
                    $this->success("正在还原...#{$part}", '', $data);
                }
                $this->success("正在还原...#{$part}", '');

            }

        } else {
            $this->error('参数错误！');
        }

    }
    /**
     * 删除备份文件
     * @param  integer $time [description]
     * @return [type]        [description]
     */
    public function delete($time = 0)
    {
        $db = new Backup();
        if ($db->delFile($time)) {
            $this->success("备份文件删除成功！");
        } else {
            $this->error("备份文件删除失败，请检查权限！");
        }
    }
    /**
     * 下载备份文件
     * @param  integer $time [description]
     * @return [type]        [description]
     */
    public function down($time = 0)
    {
        $db = new Backup();
        $db->downloadFile($time);
    }

    /**
     * 备份表
     * @return [type] [description]
     */
    public function export()
    {
        $db = new Backup();
        if (Request::isPost()) {
            $input    = input('post.');
            $fileinfo = $db->getFile();
            //检查是否有正在执行的任务
            $lock = "{$fileinfo['filepath']}backup.lock";
            if (is_file($lock)) {
                $this->error('检测到有一个备份任务正在执行，请稍后再试！');
            } else {
                //创建锁文件
                file_put_contents($lock, time());
            }
            // 检查备份目录是否可写
            is_writeable($fileinfo['filepath']) || $this->error('备份目录不存在或不可写，请检查后重试！');

            //缓存锁文件
            Session::set('lock', $lock);
            //缓存备份文件信息
            Session::set('backup_file', $fileinfo['file']);
            //缓存要备份的表
            Session::set('backup_tables', $input['tables']);
            //创建备份文件
            if (false !== $db->Backup_Init()) {
                $this->success('初始化成功！', '', ['tab' => ['id' => 0, 'start' => 0]]);
            } else {
                $this->error('初始化失败，备份文件创建失败！');
            }
        } else if (Request::instance()->isGet()) {
            $tables = Session::get('backup_tables');
            $file   = Session::get('backup_file');

            $id    = input('id');
            $start = input('start');
            $start = $db->setFile($file)->backup($tables[$id], $start);
            if (false === $start) {
                $this->error('备份出错！');
            } else if (0 === $start) {
                if (isset($tables[++$id])) {
                    $tab = array('id' => $id, 'start' => 0);
                    $this->success('备份完成！', '', array('tab' => $tab));
                } else {
                    //备份完成，清空缓存
                    unlink(Session::get('lock'));
                    Session::delete('backup_tables');
                    Session::delete('backup_file');
                    $this->success('备份完成！');
                }
            }
        } else {
            $this->error('参数错误！');
        }

    }

    /**
     * 修复表
     * @param  [type] $tables [description]
     * @return [type]         [description]
     */
    public function repair($tables = null)
    {
        $db = new Backup();
        if ($db->repair($tables)) {
            $this->success("数据表修复完成！");
        } else {
            $this->error("数据表修复出错请重试");
        }
    }
    /**
     * 优化表
     * @param  [type] $tables [description]
     * @return [type]         [description]
     */
    public function optimize($tables = null)
    {
        $db = new Backup();
        if ($db->optimize($tables)) {
            $this->success("数据表优化完成！");
        } else {
            $this->error("数据表优化出错请重试！");
        }
    }
}
